import {
  checkAllCart,
  deleteCart,
  getCartList,
  getNewCartGoods,
  insertCart,
  mergeCart,
  updateCart,
} from "@/api/cart";

// 购物车vuex模块 (state,mutations,actions)
export default {
  // 开启命名空间，彻底分离模块
  namespaced: true,
  state() {
    return {
      // 购物车商品列表
      list: [],
    };
  },
  getters: {
    // 有效商品列表
    validList(state) {
      return state.list.filter((item) => item.stock && item.isEffective);
    },
    // 有效商品总件数
    validTotal(state, getters) {
      return getters.validList.reduce((p, c) => p + c.count, 0);
    },
    // 有效商品总金额
    validAmount(state, getters) {
      return (
        getters.validList.reduce((p, c) => p + c.nowPrice * 100 * c.count, 0) /
        100
      );
    },
    // 已选择商品列表
    selectedList(state, getters) {
      return getters.validList.filter((item) => item.selected);
    },
    // 计算已选择商品总件数
    selectedTotal(state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.count, 0);
    },
    // 计算已选择商品总金额
    selectedAmount(state, getters) {
      return (
        getters.selectedList.reduce(
          (p, c) => p + c.nowPrice * 100 * c.count,
          0
        ) / 100
      );
    },
    // 全选状态
    isCheckAll(state, getters) {
      return (
        getters.selectedList.length === getters.validList.length &&
        getters.selectedList.length !== 0
      );
    },
  },
  mutations: {
    insertCart(state, goods) {
      // 如果购物车中已经存在对应的skuId的商品，数量累加
      //（更新数量，添加商品，需要展示在前面）
      const sameIndex = state.list.findIndex(
        (item) => item.skuId === goods.skuId
      );
      if (sameIndex >= 0) {
        // 购物车已经有了，数量累加即可
        goods.count = state.list[sameIndex].count + goods.count;
        // 删除之前的商品
        state.list.splice(sameIndex, 1);
      }
      state.list.unshift(goods);
    },
    updateCart(state, goods) {
      // 支持购物车数据更新 goods = {skuId,nowPrice,stock,isEffective}
      // 将来，支持选中不选中 goods = {skuId,selected:false|true}
      // 将来，支持修改数据 goods={skuId,count:2,}
      // 这种值 picture:''|null|undefined 不修改
      const updateGoods = state.list.find((item) => item.skuId === goods.skuId);
      for (const key in goods) {
        const value = goods[key]; // 需要改的值
        if (value !== null && value !== undefined && value !== "") {
          updateGoods[key] = value;
        }
      }
    },
    // 删除商品
    deleteCart(state, skuId) {
      const index = state.list.findIndex((item) => item.skuId === skuId);
      state.list.splice(index, 1);
    },
    // 设置列表
    setList(state, list) {
      state.list = list;
    },
  },
  actions: {
    async insertCart(ctx, goods) {
      if (ctx.rootState.user.profile.token) {
        // 已登录
        // 1. 调用加入购物车API函数
        await insertCart(goods);
        // 2. 拉取服务器购物车列表(调用列表API+调用修改vuex函数)
        await ctx.dispatch("getCartList");
      } else {
        // 未登录：调用mutations更新数据，自动存储本地
        ctx.commit("insertCart", goods);
      }
    },
    async getCartList(ctx) {
      if (ctx.rootState.user.profile.token) {
        // 已登录
        const data = await getCartList();
        ctx.commit("setList", data.result);
      } else {
        // 未登录
        // 每个商品都需要更新，都需要调用接口，并发发请求（同时发请求）
        const promiseArr = ctx.state.list.map((item) =>
          getNewCartGoods(item.skuId)
        );
        const results = await Promise.all(promiseArr);
        results.forEach((item, i) => {
          // list promiseArr results 三者顺序一样
          ctx.commit("updateCart", {
            skuId: ctx.state.list[i].skuId,
            ...item.result,
          });
        });
      }
    },
    async deleteCart(ctx, skuId) {
      if (ctx.rootState.user.profile.token) {
        // 已登录
        await deleteCart([skuId]);
        await ctx.dispatch("getCartList");
      } else {
        // 未登录
        ctx.commit("deleteCart", skuId);
      }
    },
    async updateCart(ctx, goods) {
      if (ctx.rootState.user.profile.token) {
        // 已登录
        await updateCart(goods);
        await ctx.dispatch("getCartList");
      } else {
        // 未登录
        ctx.commit("updateCart", goods);
      }
    },
    async checkAllCart(ctx, selected) {
      if (ctx.rootState.user.profile.token) {
        // 已登录
        // 准备有效商品的所有skuId的数组：ids
        const ids = ctx.getters.validList.map((item) => item.skuId);
        await checkAllCart({ selected, ids });
        await ctx.dispatch("getCartList");
      } else {
        // 未登录
        ctx.getters.validList.forEach((item) => {
          ctx.commit("updateCart", { skuId: item.skuId, selected });
        });
      }
    },
    async batchDeleteCart(ctx) {
      if (ctx.rootState.user.profile.token) {
        // 已登录
        // 把选中的商品的SKUID组织成数组
        const ids = ctx.getters.selectedList.map((item) => item.skuId);
        await deleteCart(ids);
        await ctx.dispatch("getCartList");
      } else {
        // 未登录
        ctx.getters.selectedList.forEach((item) => {
          ctx.commit("deleteCart", item.skuId);
        });
      }
    },
    async mergeCart(ctx) {
      // 准备参数
      const cartList = ctx.getters.validList.map(
        ({ skuId, count, selected }) => ({ skuId, count, selected })
      );
      // 参数：[{skuId,count,selected},...]
      await mergeCart(cartList);
      // 清空本地购物车
      ctx.commit("setList", []);
    },
  },
};
